<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // MDN 对闭包的定义为：
    // > 闭包是指那些能够访问自由变量的函数。

    // 那什么是自由变量呢？
    // > 自由变量是指在函数中使用的，但既不是函数参数也不是函数的局部变量的变量。

    // 由此，我们可以看出闭包共有两部分组成：
    // > 闭包 = 函数 + 函数能够访问的自由变量
    // 举个例子：
    var a = 1;

    function foo() {
        console.log(a);
    }
    foo();
    // foo 函数可以访问变量 a，但是 a 既不是 foo 函数的局部变量，也不是 foo 函数的参数，所以 a 就是自由变量。
    // 那么，函数 foo + foo 函数访问的自由变量 a 不就是构成了一个闭包嘛……
    // 还真是这样的！
    // 所以在《JavaScript权威指南》中就讲到：从技术的角度讲，所有的JavaScript函数都是闭包。
    // 咦，这怎么跟我们平时看到的讲到的闭包不一样呢！？
</script>

</html>